<?php

namespace app\models\sdiot;

use yii\base\Exception;

/**
 * Boss接口
 * Trait ApiBossTrait
 * @package app\models\sdiot
 */
trait ApiBossTrait
{
    /**
     * 用户订购套餐查询
     * @param string $telnum 号码
     * @return array
     * [
     *     {
     *         orderingtime, // 订购时间，格式：yyyymmdd
     *         starttime, // 生效时间，格式：yyyymmdd
     *         bunesstypeDesc, // 编码类型描述
     *         spid, // 企业代码
     *         producttypeDesc, // 业务类型描述
     *         bizcode, // 业务代码
     *         bunessfree, // 资费标准
     *         deadtime, // 失效效时间，格式：yyyymmdd
     *         bunesstype, // 编码类型，01 产品编码 02 企业代码+业务代码
     *         feetype, // 计费类型
     *         producttype, // 业务类型, 01 套餐 02 增值业务 03 服务
     *         bunessname, // 产品名称
     *         bunesscode // 产品唯一编码
     *     },
     *     ...
     * ]
     * @throws Exception
     */
    public function bossQrySubsPackage($telnum)
    {
        $data = [
            'telnum' => $telnum,
        ];
        $json = $this->post2('/sdiot/bossopen/qrySubsPackage', $data);
        if ($json['responseHeader']['resultCode'] != '000000') {
            throw new Exception($json['resultMessage']);
        }
        return $json['packageVos'];
    }

    /**
     * 用户套餐余量查询接口
     * @param string $telnum 号码
     * @return array
     * {
     *     rests: [
     *         {
     *             endtime, // 结束时间，yyyymmdd
     *             biztype, // 业务类型，GNTY 国内通用流量 SNTY 省内通用流量 OTHER 其他流量
     *             biztypeDesc, // 业务类型描述
     *             servtypeDesc, // 用户类型描述
     *             starttime, // 开始时间，yyyymmdd
     *             typeDesc, // 类型描述
     *             type, // 类型，GSM（通话）SMS（短信）GPRS（流量）MMS（彩信）ISMG（梦网）MMR（彩铃）WLAN（WLAN）MOP（手机定位）VGSM（可视电话）GPRSOVER(GPRS超出量)WLANOVER(WLAN超出量)GPRSALL(GPRS总使用量)
     *             sumnum, // 包月量
     *             unit, // 条/分钟/元/KB
     *             privset, // 套餐名称
     *             feename, // 费用名称
     *             leftnum, // 剩余量
     *             servtype // 用户类型（1：无套餐用户，2：普通GPRS用户，3：随E行数据卡用户，4：G3上网本用户，0：ALL）
     *         },
     *         ...
     *     ]
     * }
     * @throws Exception
     */
    public function bossQryRestOfPackage($telnum)
    {
        $data = [
            'telnum' => $telnum,
        ];
        $json = $this->post2('/sdiot/bossopen/qryRestOfPackage', $data);
        if ($json['responseHeader']['resultCode'] != '000000') {
            throw new Exception($json['resultMessage']);
        }
        return $json['rests'][0];
    }

    /**
     * 用户余额查询接口
     * @param string $telnum 号码
     * @return array
     * {
     *     present_balance, // 赠送款余额，单位：元
     *     cash_balance, // 现金预存类余额 ，用户付费类型为pptpPost时使用 单位：元
     *     shouldpay_fee, // 应缴话费，单位：分
     *     other_balance, // 其他科目余额，单位：元
     *     contract_thisused, // 协议款本期已用金额，单位：元
     *     expiredate, // 有效期，用户付费类型为pptpPre时使用
     *     custbrand, // 客户品牌
     *     balance, // 话费余额，用户付费类型为pptpPre时，使用的余额。单位：元
     *     contract_count, // 协议款数量
     *     prepaytypeDesc, // 用户付费类型描述
     *     contract_canuse, // 赠送款本期可用余额，单位：元
     *     present_drawamt, // 赠送款额度，单位：元
     *     prepaytype, // 用户付费类型，pptpPre 预付费 pptpPost 后付费
     *     present_balance_fen, // 赠款余额，单位：分
     *     contract_balance, // 协议款本期可用余额，单位：元
     *     currbillfee, // 当前帐期账单费用，单位：元
     *     currbillfee_fen, // 当前账期账单费用，单位：分
     *     contract_drawamt, // 协议款额度，单位：元
     *     present_left, // 赠送款本期剩余=赠送款额度-赠送款本期已用金额，单位：元
     *     present_canuse, // 赠送款本期可用余额，单位：元
     *     available_balance_fen, // 可用余额，单位：分
     *     shouldpay_latefee, // 应缴滞纳金，单位：分
     *     present_thisused, // 赠送款本期已用金额，单位：元
     *     contract_left, // 协议款本期剩余=协议款额度-协议款本期已用金额，单位：元
     *     hisbillfee, // 往月未缴账单话费，用户付费类型为pptpPost时使用。单位：元
     *     available_balance // 可用余额，单位：元
     * }
     * @throws Exception
     */
    public function bossQrySubsBalance($telnum)
    {
        $data = [
            'telnum' => $telnum,
        ];
        $json = $this->post2('/sdiot/bossopen/qrySubsBalance', $data);
        if ($json['responseHeader']['resultCode'] != '000000') {
            throw new Exception($json['resultMessage']);
        }
        return $json;
    }

    /**
     * 实时话费账单查询
     * @param string $telnum 手机号码
     * @param integer $cycleoffset 账期偏移量，0表示当前账期
     * @return array
     * {
     *     BILLLIST: [
     *         {
     *             SEQUENCE, // 序号
     *             ACCTSINGLE, // 账单条目
     *             ACCTSINGLENAME, // 账单条目名称
     *             FEE, // 费用，单位分
     *             STARTTIME, // 开始时间，格式：yyyymmdd
     *             ENDTIME, // 结束时间，格式：yyyymmdd
     *             BILLCYCLE // 账期，格式：yyyymm
     *         },
     *         ...
     *     ]
     * }
     * @throws Exception
     */
    public function bossQryRealTimeBill($telnum, $cycleoffset = 0)
    {
        $data = [
            'telnum' => $telnum,
            'cycleoffset' => $cycleoffset,
        ];
        $json = $this->post2('/sdiot/bossopen/qryRealTimeBill', $data);
        if ($json['res_code'] != 0) {
            throw new Exception($json['res_desc']);
        }
        return $json['result'];
    }

    /**
     * 历史账单导出
     * @param string $busiType 业务类型：001 账单，历史账单填写 001
     * @param string $groupid 集团编码
     * @param string $month 月份，格式：yyyymm
     * @param string $ftpHost FTP地址
     * @param integer $ftpPort FTP端口号
     * @param string $ftpUsername FTP登录用户名
     * @param string $ftpPasswd FTP登录密码
     * @param string $ftpFolder 文件导入的目录
     * @return string 返回的文件名称说明
     * @throws Exception
     */
    public function bossExportOpenApi($busiType, $groupid, $month, $ftpHost, $ftpPort, $ftpUsername, $ftpPasswd, $ftpFolder)
    {
        $data = [
            'busiType' => $busiType,
            'groupid' => $groupid,
            'month' => $month,
            'ftpHost' => $ftpHost,
            'ftpPort' => $ftpPort,
            'ftpUsername' => $ftpUsername,
            'ftpPasswd' => $ftpPasswd,
            'ftpFolder' => $ftpFolder,
        ];
        $json = $this->post2('/sdiot/bossopen/exportOpenApi', $data);
        if ($json['res_code'] != 0) {
            throw new Exception($json['res_desc']);
        }
        return $json['fileName'];
    }

    /**
     * 用户信息查询
     * 提供查询用户的状态，入网时间，开户时间等用户的基本信息。
     * @param string $telnum 手机号码
     * @throws Exception
     * @return array
     * {
     *     status, // 1 正使用 20 正式销户 23 预约复机 21 强制退网 22 强制退网 99 开户注销（回退） 19 临时生成资料 2 申请停机 3 欠费停用 4 欠费单停 5 欠费全停后申请全停 6 欠费单停后申请全停 7 IP直通车停机 8 强制停用 9 连带停机
     *     subsid, // 用户编码
     *     brandid, // 品牌编码 BrandSzx神州行 BrandGotone 全球通 BrandMzone 动感地带 BrandIms IMS固话
     *     brandname, // 品牌名称
     *     viptypeid, // VIP类型编码 VC0000 普通客户 VC1000 钻石卡 VC1100 金卡 VC1200 银卡
     *     viptypename, // VIP类型名称
     *     region, // 地市
     *     regionname, // 地市名称
     *     ownerorgid, // 当前归属单位
     *     ownerorgidname, // 当前归属单位名称
     *     createdate, // 创建时间
     *     paymodeid, // 付费方式编码 pptpPost后付费 pptpPre预付费
     *     paymodename, // 付费方式名称
     *     certtypeid, // 证件类型编码 IdCard 身份证
     *     certtypename, // 证件类型名称
     *     certid, // 证件号
     *     custname, // 客户名称
     *     email, // EMAIL
     *     linkaddr, // 联系地址
     *     linkphone, // LINKPHONE
     *     linkman, // 联系人
     *     mobiletel, // 移动电话
     *     custemail, // 邮寄地址
     *     postcode, // 邮编
     *     countyid, // 乡镇
     *     userisfull, // 是否补录资料 1 正式用户资料 0或者空 临时生成资料
     *     settleday, // 月结日
     *     prodid, // 主体产品ID
     *     prodidname, // 主体产品名称
     *     innetduration, // 网龄 当入参GTHREE为1时返回
     *     arpu, // 平均消费 当入参GTHREE为1时返回
     *     score, // 可用积分 当入参GTHREE为1时返回
     *     balance, // 用户余额 当入参GTHREE为1时返回
     *     areaid, // 区域
     *     currentcustmgr, // 当前客户经理 姓名+工号+联系电话
     *     responsecustmgr, // 客户经理 工号
     *     isorder4gprod, // 是否订购了4G套餐 1 订购 其他 未订购
     *     nettype, // 入网类型 GSM GSM网络 TD TD网络 M2M M2M网络
     *     trustlevel, // 用户星级 7 五星钻 6 五星金 5 五星级 4 四星级 3 三星级 2 二星级 1 一星级 0 准星级 -1 未评定星级
     *     netttpename, // 网络类型 GSM GSM网络 TD TD网络 M2M M2M网络
     *     substatusname, // 用户状态
     *     netyear, // 网龄 单位：月
     *     ownerregion, // 当前归属渠道
     *     userprodid, // 用户主体产品id
     *     userprod, // 用户主体产品名称
     *     address, // 客户地址
     *     startdate, // 开始时间 格式：yyyy-mm-dd hh24:mi:ss
     *     registerorgname, // 注册组织单位
     *     isphoto, // 是否拍照客户 1 已拍照 0或者空 未拍照
     *     realnametype, // 实名认证标记 1 已实名认证 0 未认证实名 2 非实名制
     *     userrealnametype, // 实名用户类型
     * }
     */
    public function bossQryUserInfo($telnum)
    {
        $uri = '/sdiot/bossopen/qryUserInfo';
        $data = [
            'telnum' => $telnum,
        ];
        $json = $this->post2($uri, $data);
        if (!$json['responseHeader']['isSuccess']) {
            throw new Exception($json['responseHeader']['resultMessage']);
        }
        return $json;
    }

    /**
     * 用户申请停开机
     * 手机号码正常在用的用户申请手机号码停机; 手机号码申请停机状态的用户申请手机号码开机。
     * @param string $telnum 手机号码，11位手机号码。
     * @param string $stoptype 停开机操作类型 StopSubs：申请停机 OpenSubs：申请开机
     * @param string $needPwd 停开机是否进行身份验证 1验证 0不验证
     * @param string $password 服务密码，needPwd为1时，必填
     * @param string $certid 证件号码，needPwd为1时，必填
     * @param string $changeReason 停开机原因
     * @return array
     * {
     *     RECFORMNUM // 业务流水号
     * }
     * @throws Exception
     */
    public function bossStopOpenSubs($telnum, $stoptype, $needPwd, $password, $certid, $changeReason)
    {
        $uri = '/sdiot/bossopen/stopOpenSubs';
        $data = [
            'telnum' => $telnum,
            'stoptype' => $stoptype,
            'needPwd' => $needPwd,
            'password' => $password,
            'certid' => $certid,
            'changeReason' => $changeReason,
        ];
        $json = $this->post2($uri, $data);
        if ($json['res_code'] != 0) {
            throw new Exception($json['res_desc']);
        }
        return $json;
    }

    /**
     * 用户申请批量停开机
     * 批量停开机（最多支持20个号码），手机号码正常在用的用户申请手机号码停机; 手机号码申请停机状态的用户申请手机号码开机。
     * @param string $stoptype 停开机操作类型 StopSubs：申请停机 OpenSubs：申请开机
     * @param string $groupId 集团编码
     * @param string $runRule 执行规则：01立即生效02次月生效
     * @param array $subsList
     * [
     *     {telnum, stoptype, needPwd, password, certid, changeReason},
     *     ...
     * ]
     * @see ApiBossTrait::bossStopOpenSubs()
     * @throws Exception
     * @return array
     * {
     *     taskId // 业务流水号
     * }
     */
    public function bossBatchStopOpenSubs($stoptype, $groupId, $runRule, $subsList)
    {
        $uri = '/sdiot/bossopen/batchStopOpenSubs';
        $data = [
            'stoptype' => $stoptype,
            'groupId' => $groupId,
            'runRule' => $runRule,
            'subsList' => $subsList,
        ];
        $json = $this->post2($uri, $data);
        if ($json['res_code'] != 0) {
            throw new Exception($json['res_desc']);
        }
        return $json;
    }

    /**
     * 查询集团成员号码
     * 集团id查询集团成员号码。
     * // TODO:
     */

    /**
     * 订购加油包
     * @param string $tel 手机号码
     * @param string $flowType 订购加油包套餐 F.000001 100M/10元 F.000002 5G/40元
     * @return array
     * {
     *     fee, // 总费用
     *     recoid // 业务流水
     * }
     * @throws Exception
     */
    public function bossBuyFlow($tel, $flowType)
    {
        $uri = '/sdiot/bossopen/buyFlow';
        $data = [
            'tel' => $tel,
            'flowType' => $flowType,
        ];
        $json = $this->post2($uri, $data);
        if ($json['res_code'] != 0) {
            throw new Exception($json['res_desc']);
        }
        return $json['data'];
    }

    /**
     * 取消测试期
     * @param string $tel 手机号码
     * @return array
     * {
     *     fee, // 总费用
     *     recoid // 业务流水
     * }
     * @throws Exception
     */
    public function bossUnTest($tel)
    {
        $uri = '/sdiot/bossopen/unTest';
        $data = [
            'tel' => $tel,
        ];
        $json = $this->post2($uri, $data);
        if ($json['res_code'] != 0) {
            throw new Exception($json['res_desc']);
        }
        return $json['data'];
    }
}
